# 作者： 李泉志
# 2025年01月05日15时29分秒
# 2947029073@qq.com
"""
1.1 列表的定义
• List（列表）在其他语言中通常叫做数组
• 专门用于存储一串信息
• 列表用 [] 定义，数据间使用','分隔
• 列表的索引从0开始
注意：从列表中取值时，如果超出索引范围，程序会报错
name_list = ["zhangsan", "lisi", "wangwu"]
"""

"""
1.2 列表常用操作
1.增加
列表.insert(索引, 数据) 在指定位置插入数据
列表.append(数据) 在末尾追加数据
列表.extend(列表 2) 将列表2的数据追加到列表

2.修改
列表[索引] = 数据 修改指定索引的数据

3.删除
del 列表[索引] 删除指定索引的数据
列表.remove[数据] 删除第一个出现的指定数据
列表.pop 删除末尾数据
列表.pop(索引) 删除指定索引数据
列表.clear 清空列表

4.统计 
len(列表) 列表长度
列表.count(数据) 数据在列表中出现的次数
index 搜某个值的索引值

5.排序
列表.sort() 升序排序
列表.sort(reverse=True) 降序排序
列表.reverse() 逆序、反转
"""
my_list = [1, 2, 3]
# 1.按索引取值
print(my_list[0])

# 2.查找元素
# print(my_list.index(5)) # 找不到会报错

# 3.修改元素
my_list[0] = 'li'  # 可以改不同类型的元素
print(my_list)

# 4.增加元素
my_list.append('zhangsan')
print(my_list)
my_list.insert(1, 66)
print(my_list)

# 5.删除元素
my_list.remove('li')
print(my_list)

my_list.pop()
print(my_list)

my_list.pop(1)
print(my_list)

my_list.clear()  # 清空列表后列表还在
print(my_list)
my_list.append(1)
print(my_list)

del my_list[0]
print(my_list)

del my_list  # 删除列表
# print(my_list)  # 列表已被删除

# 6.统计元素
my_list = [1, 2, 3, 2, 1, 6, 4, 5]
print(len(my_list))
print(my_list.count(1))
print(my_list.count(3))

# 删除列表所有的1，直接用remove只能删除1个元素
my_list = [x for x in my_list if x != 1]
print(my_list)

# 7.排序
my_list.sort()
print(my_list)
my_list.sort(reverse=True)
print(my_list)
my_list.reverse()
print(my_list)

print('-' * 50)
# 8.列表遍历
for i in my_list:  # 不适合删除元素，若要修改删除元素用while
    print(i, end=' ')
print()

# 9.列表生成式
my_list = [x for x in range(2, 11)]
print(my_list)

# 双重for循环生成列表
a = [j for i in range(10) for j in range(i)]
print(a)

# 二维列表
a = [[col * row for col in range(5)] for row in range(5)]
print(a)
print(a[2][3])

# 二维转一维
b = [x for row in a for x in row]
print(b)

# 只筛选偶数
a = [x for x in range(10) if x % 2 == 0]
print(a)

a = [x if x % 2 == 0 else x ** 2 for x in range(10)]
print(a)

# 10.列表简写
a = [1, 2, 3, 4, 5]
c = a
d = a
b = [2, 3, 4]
print(id(a), '=', id(c))
print(a * 2)  # 列表的复制，不是列表值乘以2

a = a + b
print('=', a)
print(id(a), '!=', id(c))  # 赋值后地址改变

d += b
print('+=', d)
print(id(d))  # += 不会改变地址，因此c和dd地址相同，同时改变值

c.extend(b)
print('extend', c)
print(id(c))  # extend方法也不会改变地址

"""
index() 取下标去拿某一个元素 O(1)
append O(1)
pop() O(1)
pop(i) O(n)
insert(i,item) O(n)
del operator O(n)
iteration O(n)
contains(in) O(n)
get slice[x:y] O(k)
del slice O(n)
set slice O(n+k)
reverse O(n)
concatenate O(k)
sort O(nlogn) 归并排序
multiply O(nk)
"""
# 切片操作
a = [1, 2, 3, 4, 5]
print(a[1:3])  # 切片操作，左闭右开
print(a[1:])  # 切片操作，左闭右开
print(a[:3])  # 切片操作，左闭右开
print(a[::2])  # 步长为2
print(a[::-1])  # 步长为负数，反转

